﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Nothing
{
    /// <summary>
    /// 枚举数辅助类
    /// </summary>
    public class EnumHelper
    {
        /// <summary>
        /// 将value值转化为枚举类型，当枚举类型不包含value时，返回枚举类型中的值最小的枚举数。
        /// </summary>
        /// <typeparam name="TEnum">枚举类型</typeparam>
        /// <param name="value">欲转换为枚举类型的值，其类型必须和枚举类型的基础类型一致 --或-- 字符串，字符串区分大小写</param>
        /// <returns>与value值对应的枚举数 --或-- 值最小的枚举数</returns>
        /// <exception cref="System.Exception">
        /// 当类型TEnum不是枚举类型
        /// --或--
        /// 枚举TEnum不存在任何枚举数
        /// </exception>
        /// <exception cref="System.ArgumentNullException">value值为null时引发</exception>
        /// <exception cref="System.ArgumentException">value的类型与枚举TEnum的基础类型不一致，同时也不是字符串</exception>
        public static TEnum Get<TEnum>(object value)
        {
            if (!typeof(TEnum).IsEnum)
            {
                throw new Exception("类型TEnum必须为枚举类型...");
            }

            var values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
            if (values.Count() == 0)
            {
                throw new Exception("枚举TEnum不存在任何枚举数...");
            }

            return Get<TEnum>(value, values.Min());
        }

        /// <summary>
        /// 将value值转化为枚举类型，当枚举类型不包含value时，返回defaultValue。
        /// </summary>
        /// <typeparam name="TEnum">枚举类型</typeparam>
        /// <param name="value">欲转换为枚举类型的值，其类型必须和枚举类型的基础类型一致 --或-- 字符串，字符串区分大小写</param>
        /// <param name="defaultValue">默认枚举数</param>
        /// <returns>与value值对应的枚举数 --或-- 默认枚举数defaultValue</returns>
        /// <exception cref="System.Exception">
        /// 当类型TEnum不是枚举类型
        /// </exception>
        /// <exception cref="System.ArgumentNullException">value值为null时引发</exception>
        /// <exception cref="System.ArgumentException">value的类型与枚举TEnum的基础类型不一致，同时也不是字符串</exception>
        public static TEnum Get<TEnum>(object value, TEnum defaultValue)
        {
            if (!typeof(TEnum).IsEnum)
            {
                throw new Exception("类型TEnum必须为枚举类型...");
            }

            if (Enum.IsDefined(typeof(TEnum), value))
            {
                if (value.GetType() == typeof(string))
                {
                    return (TEnum)Enum.Parse(typeof(TEnum), value.ToString());
                }

                return (TEnum)value;
            }

            return defaultValue;
        }
    }
}
